package Q400_499;

import java.util.Arrays;

/**
 * 453. 最小操作次数使数组元素相等
 * 给你一个长度为 n 的整数数组，每次操作将会使 n - 1 个元素增加 1 。返回让数组所有元素相等的最小操作次数。
 * <p>
 * <p>
 * 示例 1：
 * <p>
 * 输入：nums = [1,2,3]
 * 输出：3
 * 解释：
 * 只需要3次操作（注意每次操作会增加两个元素的值）：
 * [1,2,3]  =>  [2,3,3]  =>  [3,4,3]  =>  [4,4,4]
 * <p>
 * <p>
 * 示例 2：
 * <p>
 * 输入：nums = [1,1,1]
 * 输出：0
 * <p>
 * <p>
 * 提示：
 * <p>
 * n == nums.length
 * <p>
 * 1 <= nums.length <= 105
 * <p>
 * -109 <= nums[i] <= 109
 * <p>
 * 答案保证符合 32-bit 整数
 * <p>
 */
public class MinimumMovesToEqualArrayElements {
    /**
     * 每一轮需要把当前最小值加到当前最大值
     * 即计算当前最小值和最大值之差diff；
     * 前n-1个数依次加上差值并右移；
     * 首个数字变成之前的最大值（即现在的最小值）。
     *
     * @param nums
     * @return
     */
    public int minMoves(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        int min = Integer.MAX_VALUE;
        for (int num : nums) {
            min = Math.min(min, num);
        }

        int count = 0;
        for (int num : nums) {
            count += num - min;
        }
        return count;
    }


    public static void main(String[] args) {
        MinimumMovesToEqualArrayElements main = new MinimumMovesToEqualArrayElements();
        System.out.println(main.minMoves(new int[]{1}));
        System.out.println(main.minMoves(new int[]{1, 2, 3}));
    }
}
